#include<bits/stdc++.h>
using namespace std;

#define int long long
#define inf (int)(1e9)

const int mod=998244353;
const int N=1e5+9;

int n,m;
int ans1,ans2;
double L,V;
double p[N];
struct car{
    double d,v,a;
    double to;
} a[N];

double stop(int i){
    return (V*V-a[i].v*a[i].v)/2.00/a[i].v;
}
void suba(){
    for(int i=1;i<=n;++i){
        if(a[i].a==0){
            if(a[i].v>V){
                if(a[i].d<=p[m]) ++ans1;
            }
        }
    }
    cout<<ans1<<' ';
    if(!ans1) cout<<m<<'\n';
    else cout<<m-1<<'\n';
}


void subb(){
    for(int i=1;i<=n;++i){
        if(a[i].d>p[m]) continue;
        a[i].to=(a[i].v*a[i].v)+2.00*a[i].a*(p[m]-a[i].d);
        if(a[i].to>V*V) ++ans1;
    }
    cout<<ans1<<' ';
    if(!ans1) cout<<m<<'\n';
    else cout<<m-1<<'\n';
}


void subc(){}

bool use[N];
void dfs(int i){
    if(i>m){
        int ret=0,sum=0;
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j){
                if(!use[j]) continue;

                if(a[i].a==0){
                    if(a[i].v>V){
                        if(p[j]>=a[i].d){
                            ++ret;
                            break;
                        }
                    }
                }
                if(a[i].a>0){
                    if(p[j]>a[i].to){
                        ++ret;
                        break;
                    }
                }
                if(a[i].a<0){
                    if(a[i].d<=p[j] && p[j]<a[i].to){
                        ++ret;
                        break;
                    }
                }
            }
        }

        for(int i=1;i<=m;++i) if(use[i]) ++sum;
        if(ret==ans1) ans2=max(ans2,m-sum);
        return ;
    }
    use[i]=1;
    dfs(i+1);
    use[i]=0;
    dfs(i+1);
}
void bl(){

    for(int i=1;i<=n;++i){
        if(a[i].a!=0)
            a[i].to=(V*V-a[i].v*a[i].v)/2.00/a[i].a+a[i].d;
        if(a[i].a==0){
            if(a[i].v>V) a[i].to=0;
            else a[i].to=p[m]+1;
        }
    }
    for(int i=1;i<=n;++i){
        if(a[i].a>=0){
            if(a[i].to<p[m]) ++ans1;
        }else{
            int k1=(lower_bound(p+1,p+m+1,a[i].d)-p);
            int k2=(lower_bound(p+1,p+m+1,a[i].to)-p);

            if(k2-k1>0) ++ans1;
        }
    }

    dfs(1);
    cout<<ans1<<' '<<ans2<<'\n';
}

void solve(){
    ans1=ans2=0;


    cin>>n>>m>>L>>V;
    for(int i=1;i<=n;++i) a[i].to=0.0;
    for(int i=1;i<=n;++i) cin>>a[i].d>>a[i].v>>a[i].a;
    for(int i=1;i<=m;++i) cin>>p[i];
    sort(p+1,p+m+1);

    bool fA,fB,fC; // =0 >0 <0
    fA=fB=fC=1;
    for(int i=1;i<=n;++i){
        if(a[i].a==0.0) fB=fC=0;
        if(a[i].a>0.0) fA=fC=0;
        if(a[i].a<0.0) fA=fB=0;
    }
    if(n<=20) bl();
    else if(fA) suba();
    else if(fB) subb();
    else if(fC) subc();
}
signed main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);

    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int T; cin>>T;
    while(T--) solve();
}
/*

5
1 2 3 1 2

10
136 136 136 2417 136 136 2417 136 136 136
*/

/*

    for(int i=1;i<=n;++i){
        if(a[i].a==0){
            if(a[i].v>V) a[i].to=a[i].d;
            else a[i].to=L+1.0;
        }else a[i].to=stop(a[i])+a[i].d;
    }


    for(int i=1;i<=n;++i){
        if(a[i].a==0){
            if(a[i].v>V){
                if(a[i].to<=p[m]) ++ans1;
            }
        }
        if(a[i].a<0){
            int k1=(lower_bound(p+1,p+m+1,a[i].d)-p);
            int k2=(lower_bound(p+1,p+m+1,a[i].to)-p);

            if(k2-k1>0) ++ans1;
        }
        if(a[i].a>0){
            if(a[i].to<=p[m]) ++ans1;
        }
    }
    cout<<ans1<<' ';

*/
